home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl5
- use POSIX;
-
- $METACHARS = '[\{\}\(\)\*!~\<\>\?|\[\]\'\&\^\$\@#`\";:]';
- $LOGINCHARS = '[\_\-\.\{\}\(\)\*!~\<\>\?|\[\]\'\&\^\$\@#`\";:\/\s]';
-
- @bad_filenames = ('/','/usr','/etc','/bin','/sbin','/usr','/usr/sbin');
-
- $document_root = "/usr/ns-home/httpd-gateway/docs/webface";
-
- # note: when a file is checked in with ci -l, the mode is affected:
- # ci -l is equiv. to ci; co -l
- # ci (first time only) : RCS file inherets mode EXCEPT all write
- # permissions are dropped.
- # co -l : working file inherets mode EXCEPT user is given write
- # permission.
-
- sub rcs_initial {
- local($rcs_fqname) = $_[0];
- local($rcs_name) = $_[1];
- local($rcs_temp) = "/tmp/rcs_temp";
- local($rcs_err) = "/tmp/rcs_err";
- local($rcs_diff) = 0;
- local($rcs_err) = 0;
- local(@items, $com);
-
- $rcs_name = "/usr/WebFace/RCS/" . $rcs_name . ",v";
-
- system("/usr/sbin/rcsdiff $rcs_fqname $rcs_name > $rcs_temp 2>$rcs_err");
-
- # note: rcsdiff sends header to stderr, any difference to stdout
-
- open(RCS_IN, "< $rcs_err");
- while(<RCS_IN>) { $rcs_err = 1; }
- close(IN);
-
- if ($rcs_err) {
- $com = "/usr/sbin/ci -l -m\"gateway 2.1: initial state\" ";
- $com .= "$rcs_fqname $rcs_name > /dev/null 2>&1";
- system($com);
- } else {
- open(RCS_IN, "< $rcs_temp");
- while(<RCS_IN>) { $rcs_diff = 1; }
- close(RCS_IN);
-
- if ($rcs_diff) {
- $com = "/usr/sbin/ci -l -m\"gateway 2.1: manual edit\" ";
- $com .= "$rcs_fqname $rcs_name > /dev/null 2>&1";
- system($com);
- }
- }
- unlink $rcs_temp, $rcs_err;
- }
-
- sub rcs_final {
- local($rcs_fqname) = $_[0];
- local($rcs_name) = $_[1];
- local($comment) = $_[2];
- local($com);
-
- $rcs_name = "/usr/WebFace/RCS/" . $rcs_name . ",v";
-
- $com = "/usr/sbin/ci -l -m\"gateway 2.1: $comment\" ";
- $com .= "$rcs_fqname $rcs_name > /dev/null 2>&1";
- system($com);
- }
-
- sub button_table {
- $qry = $_[0];
- print "<center>\n";
- print "<table border=2 cellspacing=0 cellpadding=0 width=300>\n";
- print "<tr><th align=center>", $qry->submit(-name=>$_[1], -value=>$_[2]),
- "<th align=center>", $qry->reset,
- "<th align=center>", $qry->submit(-name=>$_[3], -value=>$_[4]),
- "</tr></table>";
- print "</center>";
- }
-
- sub hash_modem {
- local($arg) = $_[0];
- local($give) = $_[1];
- local($get) = $_[2];
- local(@items);
- open(IN_HASH,"< /usr/OnRamp/etc/modem.trans");
- while(<IN_HASH>) {
- @items = split(/:/);
- if ($arg eq $items[$give]) {
- $ret = $items[$get];
- last;
- }
- }
- close(IN_HASH);
- return $ret;
- }
-
- sub select_list {
- local(*lst) = $_[2];
- local($arg);
- local($ret) = "<select name=\"$_[0]\">\n";
- foreach $arg (@lst) {
- if ($arg eq $_[1]) { $ret .= "<option selected> $arg\n"; }
- else { $ret .= "<option> $arg\n"; }
- }
- $ret .= "</select>\n";
- return $ret;
- }
-
- sub get_config {
- my $ret;
- system("/etc/chkconfig $_[0]");
- if ($? >> 8) { $ret = "No"; }
- else { $ret = "Yes"; }
- }
-
- sub check_login {
- return 1 if $_[0] =~ /$METACHARS/o;
- return 1 if $_[0] =~ /\s/;
- return 1 if length($_[0]) > 8;
- 0;
- }
-
- sub add_password {
- local($name,$pass,$uid,$gid,$fname,$dir,$sh) = @_;
-
- if ($pass && $pass ne "*") {
- $salt = &mksalt;
- $pass = crypt($pass,$salt);
- }
- if (getpwnam($name)) {
- return 1;
- }
-
- if ($uid != 0) {
- while (1) {
- if (getpwuid($uid)) {
- $uid++;
- next;
- }
- last;
- }
- }
- $val = "$name:$pass:$uid:$gid:$fname:$dir:$sh\n";
- open(OUT,">> /etc/passwd");
- print OUT $val;
- close(OUT);
- return 0;
- }
-
- sub mksalt {
- $rand = int(rand(64*64));
-
- $chars = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- $var = $rand & 0x3f;
- $salt = substr($chars,$var,1);
- $rand >>= 6;
- $var = $rand & 0x3f;
- $salt .= substr($chars,$var,1);
-
- return $salt;
- }
-
- sub choice_list {
- local(*list) = $_[0];
- local($name) = $_[1];
- local($width) = $_[2];
- local($count = 0);
- local($arg,$i);
- local($ret) = "<tt><select name=\"$name\" size=6>\n";
- local($max) = $width-2;
- foreach $arg (@list) { if (length($arg) > $max) { $max = length($arg); } }
- $width = $max + 2;
- if (!@list) {
- $ret .= "<option>";
- for ($i=0;$i<$width;$i++) { $ret .= " "; }
- $ret .= "\n";
- }
- foreach $arg (@list) {
- $ret .= "<option> ".$arg;
- if (!$count) {
- $count = 1;
- for ($i=0;$i<$width-length($arg)-1;$i++) { $ret .= " "; }
- }
- $ret .= "\n";
- }
- $ret .= "</select></tt>\n";
-
- return $ret;
- }
-
- sub convert_ipnum {
- my($targ, $arg, @flds);
-
- ($arg) = ($_[0] =~ /^\s*(\S*)\s*$/);
-
- if ($arg eq "") { $_[1] = 1; return; }
-
- $_[1] = 0;
-
- if ($arg =~ /^0x/) {
- if ($arg =~ /^0[xX]([0-9a-fA-F]*)$/) {
- hex($arg);
- }
- else {
- $_[1] = 1;
- }
- }
- else {
- @flds = split(/\./, $arg);
-
- if ($#flds > 3) {
- $_[1] = 4;
- return;
- }
-
- $targ = 0;
-
- foreach (@flds) {
- if (! /^\d+$/) {
- $_[1] = 1;
- return;
- }
- # Changed from 254
- # if ($_ > 255 ) {
- # $_[1] = 2;
- # return;
- # }
-
- $targ = $targ * 256 + $_;
- }
-
- $targ;
- }
- }
-
- sub check_phone {
- my $phone = $_[0];
- # $phone =~ s/ //;
- # !($phone =~ /^(\d*[!#])?(1?[\/\-.]?)?(\(?\d{3}[).\/\-]?)?\d{3}[.\/\-]?\d{4}(x\d{5,})?$/);
-
- $phone =~ s/[\(\)\-\,]//g;
- $phone =~ /[^0-9]/o;
- }
-
- sub get_fields {
- my $buffer, $name, $value, $pair, @pairs;
-
- read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
-
- @pairs = split(/&/, $buffer);
-
- foreach $pair (@pairs) {
- ($name, $value) = split(/=/, $pair);
- $value =~ tr/+\t/ /;
- $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
-
- $name = "xaster" if ($name eq "*");
-
- $fld{$name} = $value;
- }
- }
-
- sub check_ipaddr {
- my $error;
- return 1 if ($_[0] =~ /\.$/);
- &convert_ipnum($_[0], $error);
- $error != 0 ? 1 : 0;
- }
-
- sub check_netmask {
- my $error, $count, $comp, $stop, $rarg;
- my $arg = &convert_ipnum($_[0], $error);
-
- return 1 if $error;
-
- $rarg = 4294967296 - $arg;
-
- $count = 0;
- $comp = 1;
- while ($count < 33 && $stop == 0) {
- if ($comp == $rarg) { $stop = 1; }
- $comp *= 2;
- $count++;
- }
- $stop ? 0 : 1;
-
- # $arg = ($arg >> 1) & 0x7FFFFFF while !($arg & 1);
- # $arg = ($arg >> 1) & 0x7FFFFFF while $arg & 1;
-
- # $arg ? 1 : 0;
- }
-
- sub check_fname {
- return "Filename $_[0] contains system metacharacters."
- if $_[0] =~ /$METACHARS/o;
- return "Filename $_[0] contains whitespace characters."
- if $_[0] =~ /\s/;
- return "Filename $_[0] must be fully qualified."
- if substr($_[0],0,1) ne "/";
-
- foreach $arg (@bad_filenames) {
- return "$_[0] is a reserved directory." if $arg eq $_[0];
- }
-
- if ($_[1]) {
- if ($_[1] == 1) {
- if (! -e $_[0]) {
- # This is stupid
- # return "File $_[0] must already exist."
- open (THE_FILE, "> $_[0]");
- close (THE_FILE);
- chmod 0644, $_[0];
- }
- }
- if ($_[1] == 2) {
- return "File $_[0] must not currently exist."
- if -e $_[0];
- }
- if ($_[1] == 3) {
- return "Directory $_[0] must already exist."
- if ! -d $_[0];
- }
- if ($_[1] == 4) {
- return "Directory $_[0] must not currently exist."
- if -e $_[0];
- }
- }
-
- return "";
- }
-
- sub parse_list {
- return split(/[, ]+/, $_[0]);
- }
-
- sub check_int {
- if ($_[0] =~ /^\s*(\d+)\s*$/) {
-
- # Min and Max
- if ($_[1]) {
- return 2 if $_[0] < $_[1];
- }
-
- if ($_[2]) {
- return 3 if $_[0] > $_[2];
- }
-
- 0;
- }
- else {
- 1;
- };
- }
-
- sub error_block {
- print qq|<font size=4 color="dd0000">Error: $_[0]</font>|;
- }
-
- sub title_block {
- print "<html><title>$_[0]</title><body>\n";
- }
-
- sub js_title_block {
- print "<html><title>$_[0]</title>\n",
- "<script language=\"JavaScript\">\n",
- "<!--\n\n",
- "$_[1]\n\n",
- "// -->\n",
- "</script></head>\n",
- "<body>\n";
- }
-
- sub header_block {
- print "<center><h1>$_[0]</h1></center>\n";
- }
-
- # $_[1] being 1 indicates that we need to check if the host exists
- # return 4 if it does exist and 0 if does not
-
- sub check_hostname {
- return 911 if $_[0] =~ /$METACHARS/o;
-
- (my $arg) = ($_[0] =~ /^\s*(\S*)\s*$/);
- if ($arg =~ /^[a-zA-Z]\w*([.\-][a-zA-Z]\w*)*$/) {
- return 4 if $_[1] == 1 && !gethostbyname($arg);
- return 0;
- }
-
- return 1;
- }
-
- open(PIPE, "<expr> | ");
-
- sub select {
- local($sel) = $_[1];
- local($op);
- local($j) = 1;
- local($ret) = "<select name=\"$_[0]\">\n";
- while ($_[++$j] ne "") {
- $op = $_[$j];
- if ($sel eq $op) { $ret .= "<option selected> $op\n"; }
- else { $ret .= "<option> $op\n"; }
- }
- $ret .= "</select>\n";
- }
-
- sub text {
- local($val) = "<input name=\"$_[0]\" ";
- if ($_[1]) { $val .= "value=\"$_[1]\" "; }
- if ($_[2]) { $val .= "size=$_[2]"; }
- $val .= ">";
- return $val;
- }
-
- sub buttons {
- local($ret) =
- qq|<center><table border=2 cellspacing=0 cellpadding=0 width=300>
- <tr><th align=center><input type="submit" name="$_[0]" value="$_[1]">
- <th align=center><input type="reset" value="Reset">
- <th align=center><input type="submit" name="help" value="Help">
- </tr></table></center></font>|;
- }
-
- sub js_buttons {
- local($ret) =
- qq|<center><table border=2 cellspacing=0 cellpadding=0 width=300>
- <tr><th align=center><input type="submit" name="$_[0]" value="$_[1]" $_[2]>
- <th align=center><input type="reset" value="Reset" $_[3]>
- <th align=center><input type="submit" name="help" value="Help" $_[3]>
- </tr></table></center></font>|;
- }
-
- sub radio {
- local($sel) = $_[1];
- local($op);
- local($ret) = "";
- local($j) = 1;
- while ($_[++$j] ne "") {
- $op = $_[$j];
- if ($sel eq $op) { $ret .= qq|<input type="radio" name="$_[0]"
- value="$op" checked>$op |; }
- else { $ret .= qq|<input type="radio" name="$_[0]" value="$op">$op |; }
- }
- return $ret;
- }
-
- sub redirect {
- print "Content-type: text/html\n\n",
- "<HTML><HEAD>",
- "<META HTTP-EQUIV=\"refresh\" CONTENT=\"0; URL=$_[0]\">",
- "</HEAD><BODY></BODY></HTML>";
- }
-
-
- # These functions are for the IP Screen scripts
-
- sub readFilterFile {
- open(FILTER, "< $_[0]");
- undef %rules;
- while(<FILTER>) {
- if(/^# /) {
- $key = $_;
- $key =~ s/^# //g;
- chop($key);
- next;
- }
- $rules{$key} .= $_;
- }
- close(FILTER);
-
- @subnets = split(/\n/,$rules{'Internal Subnets'});
- $i = 0;
- foreach $arg (@subnets) {
- @terms = split(/\./, $arg);
- if ($terms[1] eq '0' && $terms[2] eq '0' && $terms[3] eq '0') {
- $subnet_mask[$i++] = "&0xff000000=$arg";
- } elsif ($terms[2] eq '0' && $terms[3] eq '0') {
- $subnet_mask[$i++] = "&0xffff0000=$arg";
- } elsif ($terms[3] eq '0') {
- $subnet_mask[$i++] = "&0xffffff00=$arg";
- } else {
- $subnet_mask[$i++] = "=$arg";
- }
- }
- }
-
- sub readOutputFile {
- open(FILTER, "< $_[0]");
- undef %nrules;
- while(<FILTER>) {
- if(/^# /) {
- $key = $_;
- $key =~ s/^# //g;
- chop($key);
- next;
- }
- $nrules{$key} .= $_;
- }
- close(FILTER);
- }
-
- sub writeFilterFile {
- open(FILTER, "> $_[0]");
- foreach $key (keys %rules) {
- print FILTER "# $key\n";
- print FILTER $rules{$key};
- }
- close(FILTER);
- }
-
- sub addFilterFile {
- if ($_[1] eq "") { delete $rules{$_[0]}; }
- else { $rules{$_[0]} = $_[1]; }
- }
-
- sub writeOutputFile {
- open(FILTER, "> $_[0]");
- foreach $key (keys %nrules) {
- print FILTER "# $key\n";
- print FILTER $nrules{$key};
- }
- close(FILTER);
- }
-
- sub addOutputFile {
- if ($_[1] eq "") { delete $nrules{$_[0]}; }
- else { $nrules{$_[0]} = $_[1]; }
- }
-
-
- sub getInternalSubnets {
- return "" if ($rules{'Internal Subnets'} eq "");
- @subnets = split(/\n/,$rules{'Internal Subnets'});
- return @subnets;
- }
-
- sub my_goto {
- print "Content-type: text/html\n\n";
- print "<HTML><HEAD>";
- print "<META HTTP-EQUIV=\"refresh\" CONTENT=\"0; URL=$_[0]\">";
- print "</HEAD><BODY></BODY></HTML>";
- exit 0;
- }
-
- sub processSubnet {
- @terms = split(/\./, $_[0]);
- if ($terms[1] eq '0' && $terms[2] eq '0' && $terms[3] eq '0') {
- return "&0xff000000=$_[0]";
- } elsif ($terms[2] eq '0' && $terms[3] eq '0') {
- return "&0xffff0000=$_[0]";
- } elsif ($terms[3] eq '0') {
- return "&0xffffff00=$_[0]";
- } else {
- return "=$_[0]";
- }
- }
-
-
- 1;
-